import Intl from '@ohos.intl';

export function formatDate(date, fmt) {
  let obj = {
    'y': date.getFullYear(), // 年份，注意必须用getFullYear
    'M': date.getMonth() + 1, // 月份，注意是从0-11
    'd': date.getDate(), // 日期
    'q': Math.floor((date.getMonth() + 3) / 3), // 季度
    'H': date.getHours(), // 24小时制
    'h': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 12小时制
    'm': date.getMinutes(), // 分钟
    's': date.getSeconds(), // 秒
    'S': date.getMilliseconds() // 毫秒
  };

  for (let i in obj) {
    fmt = fmt.replace(new RegExp(i + '+', 'g'), function(m) {
      let val = String(obj[i]);

      for (let j = 0, len = val.length; j < m.length - len; j++) {
        val = '0' + val;
      }
      return m.length === 1 ? val : val.substring(val.length - m.length);
    });
  }
  return fmt;
}
export function getWeekDay() {
  const weekDay = new Date().getDay()
  return weekDay == 0 ? 7 : weekDay
}

export function getCurrentTime(sql: string) {
  if(sql == 'sqlPowerDaily'){
    //日查询
    let date = new Date();
    let datefmt = new Intl.DateTimeFormat("zh-CN");
    let formattedDate = datefmt.format(date);
    const dateAtt = formattedDate.split('/')
    // formattedDate = formattedDate.replace(/\//g,'-')
    const year = dateAtt[0]
    const month = dateAtt[1].padStart(2, '0')
    const day = dateAtt[2].padStart(2, '0')
    return `${year}-${month}-${day})}`
  } else if (sql == 'sqlPowerWeekly'){
    //周查询
    const targetDate = new Date();
    const year = targetDate.getFullYear();
    targetDate.setHours(0, 0, 0, 0);

    // 调整至每周的星期四（ISO 周逻辑）
    const dayOfWeek = targetDate.getDay() || 7; // 将周日 (0) 转为 7
    targetDate.setDate(targetDate.getDate() + 4 - dayOfWeek);

    // 计算当年首周的日期
    const yearStart = new Date(targetDate.getFullYear(), 0, 1);
    yearStart.setHours(0, 0, 0, 0);

    // 计算周数
    const diffMs = targetDate.getTime() - yearStart.getTime();
    const diffDays = Math.floor(diffMs / 86400000); // 毫秒转天数
    console.log('daihai ' + Math.ceil((diffDays + 1) / 7))
    return `${year}-${Math.ceil((diffDays + 1) / 7)}`
  } else if (sql == 'sqlPowerMonthly'){
    //月查询
    const date = new Date();
    // 直接获取年和月（注意：月份从 0 开始计数）
    const year = date.getFullYear();   // 2023
    const month = date.getMonth() + 1; // 1~12
    console.log('daihai month:' + `${year}-${month.toString().padStart(2, '0')}`)
    return `${year}-${month.toString().padStart(2, '0')}`
  } else {
    const targetDate = new Date();
    const year = targetDate.getFullYear();
    return `${year}`
  }
}

export function getCurrentTimeForAll() {
  let datetime = new Date();
  let dayFmt = new Intl.DateTimeFormat("zh-CN", { dateStyle: 'full' });
  let timeFmt = new Intl.DateTimeFormat("zh-CN", { timeStyle: 'medium' });

  return [dayFmt.format(datetime), timeFmt.format(datetime)]
}

// 获取当天是第几周
export function getISOCurrentWeek() {
  // 创建一个Date实例来获取当前日期和时间
  let currentDate = new Date();

  // 获取当前年份和一月一日
  let startOfYear = new Date(currentDate.getFullYear(), 0, 1);

  // 计算一月一日是星期几（0代表星期天，1代表星期一，以此类推）
  let dayOfWeekJan1 = startOfYear.getDay();

  // 计算当前日期是一年中的第几天
  let dayOfYear = Math.floor((currentDate.getTime() - startOfYear.getTime()) / (1000 * 60 * 60 * 24)) + 1;

  // 计算当前日期是第几周（ISO 8601标准，周一为一周的开始）
  // 注意：这个算法考虑了年份开始时的星期偏移
  let weekNumber = Math.ceil((dayOfYear + dayOfWeekJan1 - 1 - (dayOfWeekJan1 <= 4 ? 1 : 0)) / 7) + (dayOfWeekJan1 <= 4 ? 0 : 1);

  // 输出结果
  console.log("当前时间是第 " + weekNumber + " 周");

  return {
    year: currentDate.getFullYear(),
    week: weekNumber
  }
}

export function getWeekDates(year, weekNumber) {
  // 获取该年的第一个周一
  const getFirstMonday = (year) => {
    const date = new Date(year, 0, 1);
    const day = date.getDay(); // 0（周日）到6（周六）
    const addDays = (1 - day + 7) % 7;
    date.setDate(date.getDate() + addDays);
    return date;
  };

  // 获取当前年份和一月一日
  let startOfYear = new Date(year, 0, 1);

  // 计算一月一日是星期几（0代表星期天，1代表星期一，以此类推）
  let dayOfWeekJan1 = startOfYear.getDay();

  const firstMonday = getFirstMonday(year);
  const targetMonday = new Date(firstMonday);
  targetMonday.setDate(targetMonday.getDate() + (weekNumber - 1 - (dayOfWeekJan1 <= 4 ? 1 : 0)) * 7);

  const dates = [];
  for (let i = 0; i < 7; i++) {
    const currentDate = new Date(targetMonday);
    currentDate.setDate(currentDate.getDate() + i);

    const y = currentDate.getFullYear();
    const m = String(currentDate.getMonth() + 1).padStart(2, '0');
    const d = String(currentDate.getDate()).padStart(2, '0');
    dates.push({
      date: `${y}-${m}-${d}`,
      index: i
    });
  }

  // 格式化日期为 'YYYY-MM-DD'
  return dates
}

export function getWeeksInYear(year) {
  // 创建一个Date实例，设置为给定年份的一月一日
  let startOfYear = new Date(year, 0, 1);

  // 计算一月一日是星期几（0代表星期天，1代表星期一，...）
  let dayOfWeekJan1 = startOfYear.getDay();

  // 根据ISO 8601标准，计算第一周的开始日期
  // 如果一月一日不是星期四或之前的某一天（即不是星期五、星期六或星期天），
  // 则第一周的开始日期会是前一年的某个日期。但在这里，我们只需要知道第一周是否从一月一日开始。
  let firstWeekStartsWithJan1 = dayOfWeekJan1 <= 4;

  // 计算最后一天的日期（12月31日）
  let endOfYear = new Date(year, 11, 31);

  // 计算最后一天是星期几
  let dayOfWeekDec31 = endOfYear.getDay();

  // 计算从一月一日到12月31日之间的天数
  let daysInYear = (endOfYear.getTime() - startOfYear.getTime()) / (1000 * 60 * 60 * 24) + 1; // 加1是因为包含开始和结束日期

  // 初始化周数，如果第一周从一月一日开始，则周数为1，否则为0（因为前一周是前一年的）
  let weeksInYear = firstWeekStartsWithJan1 ? 1 : 0;

  // 遍历每一天，计算完整的周数
  for (let day = 1; day <= daysInYear; day++) {
    let currentDate = new Date(year, 0, day); // 创建当前日期的Date实例（注意月份是从0开始的）

    // 如果当前日期是新的一周的开始（根据ISO 8601，即星期一），则增加周数
    if (currentDate.getDay() === 1) {
      weeksInYear++;
    }

    // 如果已经到达了12月31日，则不需要再继续循环
    if (currentDate.getFullYear() === year && currentDate.getMonth() === 11 && currentDate.getDate() === 31) {
      break;
    }
  }

  // 处理一种特殊情况：如果12月31日是星期六或星期天，并且它不是某一周的完整一部分（即该周的其他天数在下一年），
  // 则我们需要检查前一周（即12月的最后一周）是否是完整的。如果不完整（因为开始于前一周的星期四或星期五，并且这些天数在当前年内），
  // 则我们需要将周数加1来包含这一周。但根据ISO 8601，这种情况已经由上面的逻辑自动处理了，因为我们会把12月最后那个不完整的周（如果有的话）算进来。
  // 然而，为了更加明确和避免任何混淆，我们可以添加一个额外的检查来确保这一点。但在这个特定情况下，它其实是多余的。

  // 注意：上面的代码已经足够准确，因为它会遍历每一年的每一天，并正确地计算周数。
  // 下面的注释和额外的检查只是为了解释和确保代码的准确性。

  /*
  if (dayOfWeekDec31 >= 5 && !firstWeekStartsWithJan1 &&
      (new Date(year - 1, 11, 31 - (7 - dayOfWeekDec31)).getDay() <= 4)) {
      // 如果12月31日是星期六或星期天，并且它不是某一周的完整一部分，
      // 同时前一周（即12月的最后一周，但根据我们的遍历，它实际上是“下一年”的前一周，因为我们是从一月一日开始的）
      // 在当前年内有星期四或星期五，则我们需要将周数加1（但实际上，上面的循环已经处理了这种情况）。
      weeksInYear++; // 这行代码在正常情况下是多余的，因为上面的循环已经处理了所有情况。
  }
  */

  // 返回计算得到的周数
  return weeksInYear;
}